#include "fifo_process.h"
#include "fifo_exeattr.h"
#include "wm_include.h"

/*****************************************************************************
协议说明:
	wifi端使用自定义协议进行收发
	帧头(0x7E) + 长度(两个字节) + 通信comm(一字节) + 类型Type(一字节) + 指令cmd(一字节) +留空(4字节) + 数据区data + CRC(两字节) + 帧尾(0xE7)
	
	长度:从通信到数据区的长度，不包括起始域、长度域、校验域、结束域
	
	CRC：从通信开始到数据域结束的CRC16校验值（注意不需要计算起始域、长度和结束域）
	
	通信comm：
	0x01:代表UDP通信
	0x02:代表TCP Client通信
	0x03:代表TCP Server通信

	类型Type:
	0x01:代表是配置类型
	0x02:代表是透传类型，也就是数据转发给串口

	指令cmd:
	如类型Type为0x01，则代表的就是配置指令
	如类型Type为0x02，则代表的意义如下：
	0x01：代表是串口1数据
	0x02: 代表是串口2数据
	0x03: 代表是串口3数据
	0x04: 代表是串口4数据	
	0xFF:代表所有串口
	0x05~0xFF：待补充
*****************************************************************************/
#define    TASK_SIZE      3072

//定义Process初始化宏
#define   PROCESS_INIT(pStruct,_flag,_con,_prc_msg,_get_msg)  do{(pStruct)->flag = (_flag);\
                                                                 (pStruct)->con = (_con);\
                                                                 (pStruct)->process_msg = (_prc_msg);\
                                                                 (pStruct)->get_msg = (_get_msg);\
                                                                }while(0)
																												
//Public Globe variable define
struct fifo_data rcv_wlan_fifo;	//收到wifi的数据FIFO
struct fifo_data rcv_usart_fifo;	//收到的串口的数据FIFO

//Private variable define
uint8_t rcv_wlan_buf[FIFO_RECV_WLAN_BUF_SIZE]; //wifi接收缓冲区
uint8_t rcv_usart_buf[FIFO_RCB_USART_BUF_SIZE]; //usart接收缓冲区

//Public variable define
struct process_data rcv_wlan_pd;
struct process_data send_wlan_pd;

static tls_os_queue_t 	*demo_q = NULL;
static OS_STK 			recv_wlan_fifo_TaskStk[TASK_SIZE];	
static OS_STK 			rcv_usart_fifo_TaskStk[TASK_SIZE];																																	
/*****************************************************************************
函数  名:   void fifo_usb_spi_Init(void)
功能说明:   FIFO队列初始化
参    数:   void
返回  值:   void
说    明:   无
*****************************************************************************/
static void fifo_wlan_Init(void)
{
    fifo_Init(&rcv_wlan_fifo, rcv_wlan_buf, sizeof(rcv_wlan_buf));
    fifo_Init(&rcv_usart_fifo, rcv_usart_buf, sizeof(rcv_usart_buf));

}
/*******************************************************************
函 数 名：  process_fifo_data
功能说明：  协议解包
参    数：  fifo:   操作目标FIFO
            prc:   将发送的数据内容
返 回 值：  无
*******************************************************************/
static void process_fifo_data(struct fifo_data *fifo, struct process_data *prc)
{
    switch (prc->flag)
    {
    case 0:
        if (0 == (prc->len = prc->get_msg(prc->data, fifo))) //从FIFO中获取一条指令失败
        {
            break;
        }

    case 1:
        if (FALSE == (prc->process_msg(prc->data, prc->len))) //数据处理还未完成
        {
            prc->flag = 1;
            break;
        }
				
    default:
        prc->flag = 0;
        break;
    }
}
/*****************************************************************************
函数  名:   void CMDProcessInit(void)
功能说明:   命令处理函数初始化
参    数:   void
返回  值:   void
说    明:   无
*****************************************************************************/
void CMDProcessInit(void)
{
    fifo_wlan_Init();   
    PROCESS_INIT(&rcv_wlan_pd, 0, NORMAL, wlan_recv_process, cmd_get); 
	PROCESS_INIT(&send_wlan_pd, 0, NORMAL,wlan_send_process, cmd_get);
}

/*****************************************************************************
函数  名:   process_recv_wlan_fifo_task(void)
功能说明:   处理USB接收FIFO任务处理
参    数:   void
返回  值:   void
说    明:   无
*****************************************************************************/
void process_recv_wlan_fifo_task(void)
{
    process_fifo_data(&rcv_wlan_fifo, &rcv_wlan_pd);        	//常规帧fifo处理
}

/*****************************************************************************
函数  名:   process_rcv_usart_fifo_task
功能说明:   处理SPI接收FIFO任务处理
参    数:   void
返回  值:   void
*****************************************************************************/
void process_rcv_usart_fifo_task(void)
{
    process_fifo_data(&rcv_usart_fifo, &send_wlan_pd);          //处理发送FIFO
}

static void recv_wlan_fifo_task(void *sdata)
{
	while(1)
	{
		process_recv_wlan_fifo_task();	
		tls_os_time_delay(5);
	}
}

static void recv_send_fifo_task(void *sdata)
{
	while(1)
	{
		process_rcv_usart_fifo_task();	
		tls_os_time_delay(5);
	}
}

void CreateWlanFifoTask(void)
{
	CMDProcessInit();
	tls_os_task_create(NULL, NULL,
					recv_wlan_fifo_task,
                    NULL,
                    (void *)recv_wlan_fifo_TaskStk,          /* 任务栈的起始地址 */
                    TASK_SIZE * sizeof(u32), /* 任务栈的大小     */
                    DEMO_WEBSOCKETS_TASK_PRIO,
                    0);
										
	tls_os_task_create(NULL, NULL,
					recv_send_fifo_task,
                    NULL,
                    (void *)rcv_usart_fifo_TaskStk,          /* 任务栈的起始地址 */
                    TASK_SIZE * sizeof(u32), /* 任务栈的大小     */
                    DEMO_SSL_SERVER_TASK_PRIO,
                    0);
}

